package com.lz.gmall.product.rpc;

import com.lz.gmall.cart.entity.SkuIdAndPrice;
import com.lz.gmall.common.result.Result;
import com.lz.gmall.common.result.ResultCodeEnum;
import com.lz.gmall.product.biz.SkuDetailBizService;
import com.lz.gmall.product.entity.SkuAttrValue;
import com.lz.gmall.product.entity.SkuInfo;
import com.lz.gmall.product.entity.SkuSaleAttrValue;
import com.lz.gmall.product.entity.SpuSaleAttr;
import com.lz.gmall.product.vo.AttrValueConcatVo;
import com.lz.gmall.product.vo.CategoryViewVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;

@RestController
@RequestMapping("/api/inner/product")
public class SkuDetailRpcController {

    @Autowired
    private SkuDetailBizService skuDetailBizService;



    /**
     * 远程调用接口开发，根据sku的id，获取sku对应的一级，二级，三级产品
     * @param skuId
     * @return
     */
    @GetMapping("getCategoryView/{skuId}")
    public Result<CategoryViewVo> getCategoryViewBySkuId(@PathVariable("skuId") Long skuId){
        CategoryViewVo categoryViewVo = skuDetailBizService.getCategoryViewBySkuId(skuId);
        return Result.build(categoryViewVo, ResultCodeEnum.SUCCESS);
    }

    /**
     * 远程调用接口开发，根据sku的id，获取sku的多种信息(SkuInfo)
     * @param skuId
     * @return
     */
    @GetMapping("getSkuInfoAndImage/{skuId}")
    public Result<SkuInfo> getSkuInfoAndImageById(@PathVariable("skuId") Long skuId){
        SkuInfo skuInfo = skuDetailBizService.getSkuInfoAndImageById(skuId);
        return Result.ok(skuInfo);
    }

    /**
     * 远程调用接口开发,根据sku的id查询skuInfo，从中获取price，因为价格涉及金钱，我们重新查询保证实时性
     * @param skuId
     * @return
     */
    @GetMapping("getSkuInfoPrice/{skuId}")
    public Result<SkuInfo> getSkuInfoPriceBySkuId(@PathVariable("skuId") Long skuId){
        SkuInfo skuInfo = skuDetailBizService.getSkuInfoPriceBySkuId(skuId);
        return Result.ok(skuInfo);
    }

    /**
     * 远程调用接口开发,根据sku的id,获取spu的销售属性和销售属性值
     * 添加了选中设置
     * @param skuId
     * @return
     */
    @GetMapping("getSpuSaleAttrList/{skuId}")
    public Result<List<SpuSaleAttr>> getSpuSaleAttrListBySkuId(@PathVariable("skuId") Long skuId){
        List<SpuSaleAttr> spuSaleAttrList = skuDetailBizService.getSpuSaleAttrListBySkuId(skuId);
        return Result.ok(spuSaleAttrList);
    }

    /**
     * 当选择和具体的销售属性值，那么此时就会确定一个SKU
     * 后端将当前SKU所对应的所有的兄弟SKU(包含当前SKU)以JSON的数据格式进行返回
     * 根据skuId，获取spuId,根据spuId获取所有的sku
     * @param skuId
     * @return
     */
    @GetMapping("getAttrValueConcat/{skuId}")
    public Result<List<AttrValueConcatVo>> getAttrValueConcatBySkuId(@PathVariable("skuId") Long skuId){
        List<AttrValueConcatVo> attrValueConcatVoList = skuDetailBizService.getAttrValueConcatBySkuId(skuId);
        return Result.ok(attrValueConcatVoList);
    }

    /**
     * 远程调用，获取所有的商品的skuId，是为了作为分布式缓存使用，存入布隆处理器
     * 防止随机数的穿透
     * @return
     */
    @GetMapping("/getAllStuIdByRpc")
    public Result<List<Long>> getAllStuIdByRpc(){
        List<Long> skuIdList =  skuDetailBizService.getAllStuIdByRpc();
        return Result.ok(skuIdList);
    }

    /**
     * 远程调用，获取所有商品的价格
     * 在购物车中完成数据库和redis中价格的一致性，自己开发的
     * @return
     */
    @GetMapping("/getSkuAllPrice")
    public Result<List<SkuIdAndPrice>> getSkuAllPrice(){
        List<SkuIdAndPrice> priceList = skuDetailBizService.getSkuAllPrice();
        return Result.ok(priceList);
    }
}
